#include "biTree.h"

/**
 * 功 能：
 *      创建并且初始二叉树 - 直接定义
 * 参 数：
 *      无
 * 返回值：
 *      无
 **/
void BiTree_Create_v(void)
{
    // 二叉树的节点定义
    BiTNode t1, t2, t3, t4, t5, t6;
    /* 内存初始化为0，这样用"^"表示的区域直接略过不写，就是NULL */
    memset(&t1, 0, sizeof(BiTNode));
    memset(&t2, 0, sizeof(BiTNode));
    memset(&t3, 0, sizeof(BiTNode));
    memset(&t4, 0, sizeof(BiTNode));
    memset(&t5, 0, sizeof(BiTNode));
    memset(&t6, 0, sizeof(BiTNode));
    /* 二叉树的数据初始化 */
    t1.data = 'A';
    t2.data = 'B';
    t3.data = 'C';
    t4.data = 'D';
    t5.data = 'E';
    t6.data = 'F';
    /* 二叉树的关系式的创建 */
    t1.lchild = &t2;
    t1.rchild = &t3;
    t2.lchild = &t4;
    t2.rchild = &t5;
    t3.lchild = &t6;

    printf("%s Finished!\n", __func__);
}

/**
 * 功 能：
 *      创建并且初始二叉树 - 指针定义
 * 参 数：
 *      无
 * 返回值：
 *      无
 **/
void BiTree_Create_p(void)
{
    /* 通过指针的形式创建，下面的两种创建方式一样的 */
#if 0 
    BiTNode *p1, *p2, *p3, *p4, *p5, *p6;
#else
    BiTree p1, p2, p3, p4, p5, p6;
#endif
    p1 = (BiTNode *)malloc(sizeof(BiTNode));
    p2 = (BiTNode *)malloc(sizeof(BiTNode));
    p3 = (BiTNode *)malloc(sizeof(BiTNode));
    p4 = (BiTNode *)malloc(sizeof(BiTNode));
    p5 = (BiTNode *)malloc(sizeof(BiTNode));
    p6 = (BiTNode *)malloc(sizeof(BiTNode));
    memset(p1, 0, sizeof(BiTNode));
    memset(p2, 0, sizeof(BiTNode));
    memset(p3, 0, sizeof(BiTNode));
    memset(p4, 0, sizeof(BiTNode));
    memset(p5, 0, sizeof(BiTNode));
    memset(p6, 0, sizeof(BiTNode));

    p1->data = 'A';
    p2->data = 'B';
    p3->data = 'C';
    p4->data = 'D';
    p5->data = 'E';
    p6->data = 'F';
    /* 二叉树的关系式的创建 */
    p1->lchild = p2;
    p1->rchild = p3;
    p2->lchild = p4;
    p2->rchild = p5;
    p3->lchild = p6;

    printf("%s Finished! \n", __func__);
}

/**
 * 功 能：
 *      创建并且初始三叉树 - 三叉连表示法
 * 参 数：
 *      无
 * 返回值：
 *      无
 **/
void TriTree_Create(void)
{
    TriTNode tr1, tr2, tr3, tr4, tr5, tr6;
    /* 内容村初始化为0 */
    memset(&tr1, 0, sizeof(TriTNode));
    memset(&tr2, 0, sizeof(TriTNode));
    memset(&tr3, 0, sizeof(TriTNode));
    memset(&tr4, 0, sizeof(TriTNode));
    memset(&tr5, 0, sizeof(TriTNode));
    memset(&tr6, 0, sizeof(TriTNode));
    tr1.data = 'A';
    tr2.data = 'B';
    tr3.data = 'C';
    tr4.data = 'D';
    tr5.data = 'E';
    tr6.data = 'F';
    /* 三叉树的关系式的创建 */
    tr1.lchild = &tr2;
    tr1.rchild = &tr3;
    tr2.lchild = &tr4;
    tr2.rchild = &tr5;
    tr2.parent = &tr1;
    tr3.lchild = &tr6;
    tr3.parent = &tr1;
    tr4.parent = &tr2;
    tr5.parent = &tr2;
    tr6.parent = &tr3;

    printf("%s Finished!\n", __func__);
}

/**
 * 功 能：
 *      创建并且初始二叉树 - 双亲表示法
 * 参 数：
 *      无
 * 返回值：
 *      无
 * 说 明：
 *      为了方便标识根节点，parentPostion、LRFlag两个元素全部为0标识根节点，当然您可以随意定义的 
 **/
void BPTree_Create(void)
{
    BPTree tree;

    memset(&tree, 0, sizeof(BPTree));
    /* 根节点,使用特殊标识来表示根节点 */
    tree.nodes[0].parentPostion = 0;
    tree.nodes[0].data = 'A';
    tree.nodes[0].LRFlag = 0;
    /* B节点，LRFlag = 1 表示为左孩子节点 */
    tree.nodes[1].parentPostion = 0;
    tree.nodes[1].data = 'B';
    tree.nodes[1].LRFlag = 1;
    /* C节点，LRFlag = 2 表示为右孩子节点 */
    tree.nodes[2].parentPostion = 0;
    tree.nodes[2].data = 'C';
    tree.nodes[2].LRFlag = 2;
    /* D节点 */
    tree.nodes[3].parentPostion = 1;
    tree.nodes[3].data = 'D';
    tree.nodes[3].LRFlag = 1;
    /* E节点 */
    tree.nodes[4].parentPostion = 1;
    tree.nodes[4].data = 'E';
    tree.nodes[4].LRFlag = 2;
    /* F节点 */
    tree.nodes[5].parentPostion = 2;
    tree.nodes[5].data = 'F';
    tree.nodes[5].LRFlag = 1;

    tree.nodeCnt = 6;

    printf("%s Finished! nodeCnt = %d \n", __func__, tree.nodeCnt);
}

func_BiTree fun_BiTree = {
    BiTree_Create_v,
    BiTree_Create_p,
    TriTree_Create,
    BPTree_Create,
};
